import numpy as np
%matplotlib notebook
import matplotlib.pyplot as plt
import ipywidgets as widgets
from maux import *
Lineárna lomená funkcia je určená rovnicou
Nakreslenie grafu lineárne lomenej funkcie danej rovnicou
#####
##### nakreslenie grafu funkcie
#####
#### vstupné údaje
def f(X): return X / (X - 1) # ufunc verzia funkcie
X = np.linspace(-5, 7, 12*20+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
X1, X2 = X[X < 1], X[X > 1] # číslo 1 nepatrí do oboru definície
Y1, Y2 = f(X1), f(X2) # odpovedajúce hodnoty závislej premennej
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 7.5) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Graf funkcie $y = \dfrac{x}{x-1}$", fontdict={'verticalalignment': 'bottom'}) # pomenovanie diagramu
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
#ax.grid() # pravoúhla sieť
ax.set_ylim(-4.5, 5.5) # ohraničenie hodnôt pre osu y
ax.set_xticks(range(-5, 7+1)) # kótovanie x-ovej osi
ax.set_yticks(range(-4, 5+1)) # kótovanie y-ovej osi
## graf funkcie
color = ax.plot([], [])[0].get_color()
ax.plot(X1, Y1, c=color)
ax.plot(X2, Y2, c=color)
### archivácia obrázka
#fig.savefig("<meno súboru>.png")
### samotné zobrazenie
fig.show()
Vyšetrenie priebehu lineárne lomenej funkcie danej rovnicou
Ako vypočítať asymptoty? Všimnime si najprv, že platí
Treba ešte nájsť asymptoty bez smernice grafu funkcie. Všimnime si najprv, že platí
#####
##### vyšetrenie priebehu funkcie
#####
#### vstupné údaje
def f(X): return X / (X - 1) # ufunc verzia funkcie
X = np.linspace(-5, 7, 12*20+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
X1, X2 = X[X < 1], X[X > 1] # číslo 1 nepatrí do oboru definície
Y1, Y2 = f(X1), f(X2) # odpovedajúce hodnoty závislej premennej
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 7.5) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Priebeh funkcie $y = \dfrac{x}{x-1}$", fontdict={'verticalalignment': 'bottom'}) # pomenovanie diagramu
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
ax.grid() # pravoúhla sieť
ax.set_ylim(-4.5, 5.5) # ohraničenie hodnôt pre osu y
ax.set_xticks(range(-5, 7+1)) # kótovanie x-ovej osi
ax.set_yticks(range(-4, 5+1)) # kótovanie y-ovej osi
## graf funkcie
color = ax.plot([], [])[0].get_color()
ax.plot(X1, Y1, c=color)
ax.plot(X2, Y2, c=color)
## nulové body
ax.plot(0, 0, 'o', label="nulový bod")
## asymptota so smernicou
Ax1 = X
Ay1 = np.ones(len(Ax1))
ax.plot(Ax1, Ay1, '--', lw=1, label=r"asymptota so smernicou")
## asymptota bez smernice
Ay2 = np.linspace(-4.5, 5.5, 10*10+1)
Ax2 = np.ones(len(Ay2))
ax.plot(Ax2, Ay2, '--', lw=1, label="asymptota bez smernice")
## legenda
ax.legend()
### archivácia obrázka
#fig.savefig("<meno súboru>.png")
### samotné zobrazenie
fig.show()
V nasledujúcich príkladoch budeme kresliť grafy a vyšetrovať priebeh lineárne lomených funkcií. Pretože tieto funkcie majú neohraničený definičný obor, budeme pri zostrojovaní grafu každej takejto funkcie vykreslovať len jej zaujímavú časť. Pri vyšetrovani priebehu týchto funkcií treba určiť:
Súradnice bodov, ktoré sú zrejmé z grafu, netreba explicitne uvádzať.
Doporučujeme tiež rozdeliť riešenie do dvoch častí:
#####
##### šablóna riešenia (nakreslenie grafu a vyšetrenie priebehu funkcie)
#####
#### vstupné údaje
# def f(X): return None # ufunc verzia funkcie
# X = np.linspace(None, None, None+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
# X1, X2 = X[X < None], X[X > None] # číslo None nepatrí do oboru definície
# Y1, Y2 = f(X1), f(X2) # odpovedajúce hodnoty závislej premennej
#### obrázok s jedným diagramom
# fig, ax = plt.subplots()
# fig.set_size_inches(6, 4) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
# init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
# ax.set_title(r"Graf funkcie $y = \dfrac{ax+b}{cx+d}$", fontdict={'verticalalignment': 'bottom'}) # pomenovanie diagramu
# ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
# ax.grid() # pravoúhla sieť
# ax.set_ylim(None, None) # ohraničenie hodnôt pre osu y
# ax.set_xticks(np.linspace(None, None, None+1)) # kótovanie x-ovej osi
# ax.set_yticks(np.linspace(None, None, None+1)) # kótovanie y-ovej osi
## graf funkcie
# color = ax.plot([], [])[0].get_color()
# ax.plot(X1, Y1, c=color)
# ax.plot(X2, Y2, c=color)
## nulové body funkcie
# ax.plot(None, 0, 'o', label=r"nulový bod")
# ax.annotate(r"$[None,0]$", xy=(None, 0)) # prípadná anotácia význačného bodu
## asymptota so smernicou
# Ax1 = X
# Ay1 = np.ones(len(Ax1)) * None
# ax.plot(Ax1, Ay1, '--', lw=1, label=r"asymptota so smernicou")
## asymptota bez smernice
# Ay2 = np.linspace(None, None, None+1)
# Ax2 = np.ones(len(Ay2)) * None
# ax.plot(Ax2, Ay2, '--', lw=1, label=r"asymptota bez smernice")
## legenda
# ax.legend()
# ax.legend(loc='center') # umiestenie v strede diagramu
### archivácia obrázka
# fig.savefig("<meno súboru>.png")
### samotné zobrazenie
# fig.show()
V
nasledujúcich príkladoch si ukážeme, ako kresliť grafy parametrických
systémov lineárne lomených funkcií. V niektorých z nich sa vykreslenie
deje pomocou interaktívnych prvkov knižnice ipywidgets
.
Dokumentácia:
V príkladoch si tiež aktívne precvičíme niektoré elementárne transformácie grafov funkcií.
Nakreslenie grafu lineárne lomenej funkcie danej rovnicou
#####
##### grafy parametrického systému funkcií (interaktívna verzia)
#####
#### vstupné údaje
N = 8 # na oboch osiach sa zobrazí interval hodnôt 〈-N, N〉
def f(X, a, b, c, d): return (a * X + b) / (c * X + d)
X = np.linspace(-N, N, 2*N*30+1)
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(8, 9)
### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
#ax.grid() # pravoúhla sieť
ax.set_ylim(-N, N) # ohraničenie hodnôt pre osu y
#ax.set_xticks(range(-N, N+1)) # kótovanie x-ovej osi
#ax.set_yticks(range(-N, N+1)) # kótovanie y-ovej osi
## graf funkcie
def plot_graph(a, b, c, d):
n = -d / c
X1, X2 = X[X < n], X[X > n] # číslo n nepatrí do oboru definície
ax.set_title(r"Graf funkcie $y = \dfrac{{{0}x+{1}}}{{{2}x+{3}}}$".format(a, b, c, d), fontdict={'verticalalignment': 'bottom'})
if ax.lines:
ax.lines[1].set_xdata(X1)
ax.lines[1].set_ydata(f(X1, a, b, c, d))
ax.lines[2].set_xdata(X2)
ax.lines[2].set_ydata(f(X2, a, b, c, d))
else:
color = ax.plot([], [])[0].get_color()
ax.plot(X1, f(X1, 0, 1, 1, 0), c=color)
ax.plot(X2, f(X2, 0, 1, 1, 0), c=color)
widgets.interact(plot_graph,
a=widgets.IntSlider(min=-N//2, max=N//2, value=0),
b=widgets.IntSlider(min=-N//2, max=N//2, value=1),
c=widgets.SelectionSlider(options=[k for k in range(-N//2, N//2+1) if k != 0], value=1),
d=widgets.IntSlider(min=-N//2, max=N//2, value=0),
)
### archivácia obrázka
#fig.savefig("<meno súboru>.png")
### samotné zobrazenie
fig.show()
Nakreslenie grafu lineárne lomenej funkcie danej rovnicou vo vrcholovom tvare
#####
##### grafy parametrického systému funkcií (interaktívna verzia)
#####
#### vstupné údaje
N = 8 # na oboch osiach sa zobrazí interval hodnôt 〈-N, N〉
def f(X, k, m, n): return k / (X - m) + n
X = np.linspace(-N, N, 2*N*30+1)
Ax1 = X # asymptota so smernicou
Ay2 = X # asymptota bez smernice
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(8, 9)
### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
#ax.grid() # pravoúhla sieť
ax.set_ylim(-N, N) # ohraničenie hodnôt pre osu y
#ax.set_xticks(range(-N, N+1)) # kótovanie x-ovej osi
#ax.set_yticks(range(-N, N+1)) # kótovanie y-ovej osi
## graf funkcie
def plot_graph(k, m, n):
X1, X2 = X[X < m], X[X > m] # číslo m nepatrí do oboru definície
ax.set_title(r"Graf funkcie $y = \dfrac{{{0}}}{{x-{1}}}+{2}$".format(k, m, n), fontdict={'verticalalignment': 'bottom'})
Ay1 = n * np.ones(len(Ax1)) # asymptota so smernicou
Ax2 = m * np.ones(len(Ay2)) # asymptota bez smernice v bode m
if ax.lines:
ax.lines[1].set_xdata(X1)
ax.lines[1].set_ydata(f(X1, k, m, n))
ax.lines[2].set_xdata(X2)
ax.lines[2].set_ydata(f(X2, k, m, n))
ax.lines[3].set_ydata(Ay1) # asymptota so smernicou
ax.lines[4].set_xdata(Ax2) # asymptota bez smernice v bode m
else:
color = ax.plot([], [])[0].get_color()
ax.plot(X1, f(X1, 1, 0, 0), c=color)
ax.plot(X2, f(X2, 1, 0, 0), c=color)
ax.plot(Ax1, Ay1, 'k--', lw=1) # asymptota so smernicou
ax.plot(Ax2, Ay2, 'k--', lw=1) # asymptota bez smernice v bode m
widgets.interact(plot_graph,
k=widgets.SelectionSlider(options=[k for k in range(-N//2, N//2+1) if k != 0], value=1),
m=widgets.IntSlider(min=-N//2, max=N//2, value=0),
n=widgets.IntSlider(min=-N//2, max=N//2, value=0),
)
### archivácia obrázka
#fig.savefig("<meno súboru>.png")
### samotné zobrazenie
fig.show()